/*
 * 英才汇硕信息科技有限公司 拥有本软件版权 2021 并保留所有权利。
 * Copyright 2021, YCHS Information&Science Techology Co.,Ltd,
 * All right reserved.
 */
package com.ychs.lawyerback.exception;


import com.ychs.lawyerback.common.R;
import com.ychs.lawyerback.common.ResultCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 全局异常处理器
 * 流程里面在什么位置起作用
 *
 * 全局异常处理器的注解
 * @RestControllerAdvice = @ControllerAdvice + @ResponseBody
 *
 * @author mayujing
 * @version 1.0
 */
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandle {

    //接收service抛出的异常
    @ExceptionHandler(BussinessException.class)
    public R<?> handleBussinessException(BussinessException ex) {
        log.info("发生了异常:"+ex.getMessage()+"code:"+ex.getCode());
        return R.fail(ex.getCode(), ex.getMessage());//用了resultcode里的自定义异常抛出
    }



    //参数异常时用这个
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public R<?> handleMenthoeArgumentException(
            MethodArgumentNotValidException ex){
        //ex.getBindingResult() 获取校验失败的参数信息，返回BindingResult
        //对象，里面包含所有校验失败的详细信息，可进一步获取错误的字段，错误的信息
        //getFieldErrors() 返回所有校验失败的字段错误信息列表，是个集合，里面包含
        // 校验失败的字段名error.getField()，失败的提示信息
        List<String> errors = ex.getBindingResult().getFieldErrors()
                .stream().map(
                        error -> error.getField() + ":" + error.getDefaultMessage())
                .collect(Collectors.toList());
        return R.fail(ResultCode.PARAMS_ERROR,errors);
    }




    //没捕获到时会使用这个大异常
    @ExceptionHandler(Exception.class)
    public R<?> handleException(Exception e) {
       log.info("发生了大异常"+e.getMessage());
       return R.fail();
    }
}
